// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件，未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import * as qiniu from 'qiniu-js'
import Cos from 'cos-js-sdk-v5';
import axios from 'axios'
import { uploadVideoOfLocal } from "@/api/product";

export default {

  videoUpload(config) {
    if(config.type === 'COS') {
      return this.cosUpload(config.evfile, config.res.data, config.uploading)
    } else if(config.type === 'OSS') {
      // return this.ossHttp(config.evfile, config.res, config.uploading)
      return this.uploadMp4ToLocal(config.evfile,config.uploading);
    } else if(config.type === 'local') {
      return this.uploadMp4ToLocal(config.evfile, config.res, config.uploading);
    } else {
      return this.qiniuHttp(config.evfile, config.res, config.uploading)
    }
  },
  cosUpload(file, config, uploading) {
    console.log(config)
    const cos = new Cos({
      getAuthorization(options, callback) {
        callback({
          TmpSecretId: config.credentials.tmpSecretId, // 临时密钥的 tmpSecretId
          TmpSecretKey: config.credentials.tmpSecretKey, // 临时密钥的 tmpSecretKey
          XCosSecurityToken: config.credentials.sessionToken, // 临时密钥的 sessionToken
          ExpiredTime: config.expiredTime // 临时密钥失效时间戳，是申请临时密钥时，时间戳加 durationSeconds
        })
      }
    })
    const fileObject = file.target.files[0]
    console.log(fileObject)
    const Key = fileObject.name
    const pos = Key.lastIndexOf('.')
    let suffix = ''
    if(pos !== -1) {
      suffix = Key.substring(pos)
    }
    const filename = new Date().getTime() + suffix
    return new Promise((resolve, reject) => {
      cos.sliceUploadFile({
        Bucket: config.bucket, /* 必须 */
        Region: config.region, /* 必须 */
        Key: filename, /* 必须 */
        Body: fileObject, // 上传文件对象
        onProgress: function(progressData) {
          console.log(progressData)
          uploading(progressData)
        }
      }, function(err, data) {
        if(err) {
          reject({ msg: err })
        } else {
          resolve({ url: 'http://' + data.Location, ETag: data.ETag })
        }
      })
    })
  },
  cosHttp(evfile, res, videoIng) {
    // 腾讯云
    // 对更多字符编码的 url encode 格式
    const camSafeUrlEncode = function(str) {
      return encodeURIComponent(str)
        .replace(/!/g, '%21')
        .replace(/'/g, '%27')
        .replace(/\(/g, '%28')
        .replace(/\)/g, '%29')
        .replace(/\*/g, '%2A')
    }
    const fileObject = evfile.target.files[0]
    const Key = fileObject.name
    const pos = Key.lastIndexOf('.')
    let suffix = ''
    if(pos !== -1) {
      suffix = Key.substring(pos)
    }
    const filename = new Date().getTime() + suffix
    const data = res.data
    const XCosSecurityToken = data.credentials.sessionToken
    const url = data.url + camSafeUrlEncode(filename).replace(/%2F/g, '/')
    const xhr = new XMLHttpRequest()
    xhr.open('PUT', url, true)
    XCosSecurityToken && xhr.setRequestHeader('x-cos-security-token', XCosSecurityToken)
    xhr.upload.onprogress = function(e) {
      const progress = Math.round(e.loaded / e.total * 10000) / 100
      videoIng(true, progress)
    }
    return new Promise((resolve, reject) => {
      xhr.onload = function() {
        console.log('上传中')
        if(/^2\d\d$/.test('' + xhr.status)) {
          var ETag = xhr.getResponseHeader('etag')
          console.log(null, { url: url, ETag: ETag })
          videoIng(false, 0)
          resolve({ url: url, ETag: ETag })
        } else {
          reject({ msg: '文件 ' + filename + ' 上传失败，状态码：' + xhr.statu })
        }
      }
      xhr.onerror = function() {
        reject({ msg: '文件 ' + filename + '上传失败，请检查是否没配置 CORS 跨域规' })
      }
      xhr.send(fileObject)
      xhr.onreadystatechange = function() {
        console.log(xhr.statusText, xhr.responseText, 'xhr')
      }
    })
  },
  ossHttp(evfile, res, videoIng) {
    const that = this
    const fileObject = evfile.target.files[0]
    const file = fileObject.name
    const pos = file.lastIndexOf('.')
    let suffix = ''
    if(pos !== -1) {
      suffix = file.substring(pos)
    }
    const filename = new Date().getTime() + suffix
    const formData = new FormData()
    const data = res.data
    // 注意formData里append添加的键的大小写
    formData.append('key', filename) // 存储在oss的文件路径
    formData.append('OSSAccessKeyId', data.accessid) // accessKeyId
    formData.append('policy', data.policy) // policy
    formData.append('Signature', data.signature) // 签名
    // 如果是base64文件，那么直接把base64字符串转成blob对象进行上传就可以了
    formData.append('file', fileObject)

    formData.append('success_action_status', 200) // 成功后返回的操作码
    const url = data.host
    axios.defaults.headers.post['Content-Type'] = 'multipart/form-data';
    const fileUrl = url + '/' + filename
    videoIng(true, 100)
    return new Promise((resolve, reject) => {
      axios.defaults.withCredentials = false
      axios.post(url, formData).then(() => {
        // that.progress = 0;
        videoIng(false, 0)
        resolve({ url: fileUrl })
      }).catch(res => {
        reject({ msg: res })
      })
    })
  },
  qiniuHttp(evfile, res, videoIng) {
    const uptoken = res.data.token
    const file = evfile.target.files[0] // Blob 对象，上传的文件
    const Key = file.name // 上传后文件资源名以设置的 key 为主，如果 key 为 null 或者 undefined，则文件资源名会以 hash 值作为资源名。
    const pos = Key.lastIndexOf('.')
    let suffix = ''
    if(pos !== -1) {
      suffix = Key.substring(pos)
    }
    const filename = new Date().getTime() + suffix
    const fileUrl = res.data.domain + '/' + filename
    const config = {
      useCdnDomain: true
    }
    const putExtra = {
      fname: '', // 文件原文件名
      params: {}, // 用来放置自定义变量
      mimeType: null // 用来限制上传文件类型，为 null 时表示不对文件类型限制；限制类型放到数组里： ["image/png", "image/jpeg", "image/gif"]
    }
    const observable = qiniu.upload(file, filename, uptoken, putExtra, config)
    return new Promise((resolve, reject) => {
      observable.subscribe({
        next: (result) => {
          console.log(result)
          const progress = Math.round(result.total.loaded / result.total.size)
          videoIng(true, progress)
          // 主要用来展示进度
        },
        error: (errResult) => {
          // 失败报错信息
          reject({ msg: errResult })
        },
        complete: (result) => {
          // 接收成功后返回的信息
          videoIng(false, 0)
          resolve({ url: fileUrl })
        }
      })
    })
  },
  // 本地上传/oss
  uploadMp4ToLocal(evfile, videoIng) {
    const fileObject = evfile.target.files[0]; // 获取的文件对象
    const formData = new FormData()
    formData.append('file', fileObject);
    videoIng(true, 100);

    return uploadVideoOfLocal(formData);
  }
}
